package org.example.DataStructure.Stack;

//用栈实现逆波兰表达式
public class ReversePolishNotationText {
    public static void main(String[] args) {
        //中缀表达式3*(17-15)+18/6的中缀表达式如下
        String[] notation = {"3", "17", "15", "-", "*", "18", "6", "/", "+"};
        int result = calculate(notation);
        //结果是
        System.out.println(result);
    }

    //计算逆波兰表达式
    public static int calculate(String[] notation) {
        //创建一个整数栈
        Stack<Integer> stack = new Stack<>();
        for (String str : notation) {
            if (!isSymbol(str)) {
                //如果不是符号那么把数字压栈
                stack.push(Integer.parseInt(str));
            } else {
                //如果是符号那么利用这个符号计算前两个数
                int num1 = stack.pop();
                int num2 = stack.pop();
                stack.push(calculateTwo(num1, num2, str));
            }
        }
        //返回栈顶元素并删除
        return stack.pop();
    }

    //判断是否为符号
    public static boolean isSymbol(String str) {
        return str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/");
    }

    //计算两个数的操作
    public static int calculateTwo(int a, int b, String str) {
        return switch (str) {
            case "+" -> a + b;
            case "-" -> b - a;
            case "*" -> a * b;
            case "/" -> b / a;
            default -> 0;
        };
    }
}
